home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / iflib / execute.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-04  |  1.7 KB  |  82 lines

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <fcntl.h>
  7. #include <sys/wait.h>
  8. #include "lutil.h"
  9.  
  10. int execute(cmd,file,pkt,in,out,err)
  11. char *cmd,*file,*pkt,*in,*out,*err;
  12. {
  13.     char buf[128];
  14.     char *vector[16];
  15.     int i;
  16.     char *p,*q,*f=file,*k=pkt;
  17.     int pid,status,rc;
  18.  
  19.     for (p=cmd,q=buf;(*p) && (q < (buf+sizeof(buf)-1));p++)
  20.     switch (*p)
  21.     {
  22.     case '$':    switch (*(++p))
  23.             {
  24.             case 'f':
  25.             case 'F': if ((f)) while (*f) *(q++)=*(f++); f=file; break;
  26.             case 'p':
  27.             case 'P': if ((k)) while (*k) *(q++)=*(k++); k=pkt; break;
  28.             default: *(q++)='$'; *(q++)=*p; break;
  29.             }
  30.             break;
  31.     case '\\':    *(q++)=*(++p); break;
  32.     default: *(q++)=*p; break;
  33.     }
  34.     *q='\0';
  35.     loginf("Execute: %s",buf);
  36.     i=0;
  37.     vector[i++]=strtok(buf," \t\n");
  38.     while ((vector[i++]=strtok(NULL," \t\n")) && (i<16));
  39.     vector[15]=NULL;
  40.     fflush(stdout);
  41.     fflush(stderr);
  42.     if ((pid=fork()) == 0)
  43.     {
  44.         if (in)
  45.         {
  46.             close(0);
  47.             if (open(in,O_RDONLY) != 0)
  48.             {
  49.                 logerr("$Reopen of stdin to %s failed",in);
  50.                 exit(-1);
  51.             }
  52.         }
  53.         if (out)
  54.         {
  55.             close(1);
  56.             if (open(out,O_WRONLY | O_APPEND | O_CREAT,0600) != 1)
  57.             {
  58.                 logerr("$Reopen of stdout to %s failed",out);
  59.                 exit(-1);
  60.             }
  61.         }
  62.         if (err)
  63.         {
  64.             close(2);
  65.             if (open(err,O_WRONLY | O_APPEND | O_CREAT,0600) != 2)
  66.             {
  67.                 logerr("$Reopen of stderr to %s failed",err);
  68.                 exit(-1);
  69.             }
  70.         }
  71.         rc=execv(vector[0],vector);
  72.         logerr("$Exec \"%s\" returned %d",vector[0],rc);
  73.         exit(-1);
  74.     }
  75.     while (((rc=wait(&status)) != pid) && ((rc=wait(&status)) != 0))
  76.         logerr("$Wait returned %d, status %d,%d",rc,status>>8,status&0xff);
  77.     if ((status&0xff) == 0) rc=status>>8;
  78.     else rc=status&0xff;
  79.     debug(2,"rc=%d",rc);
  80.     return rc;
  81. }
  82.